package ar.republicagroup.gestion.services.impl;

import ar.republicagroup.gestion.dao.BolsaChequeDAO;
import ar.republicagroup.gestion.entities.BolsaCheque;
import ar.republicagroup.gestion.entities.Cheque;
import ar.republicagroup.gestion.entities.ChequeEstado;
import ar.republicagroup.gestion.entities.Cliente;
import ar.republicagroup.gestion.services.BolsaChequeServices;
import ar.republicagroup.gestion.services.ChequeEstadoServices;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import org.apache.log4j.Logger;

public class BolsaChequeServicesImpl implements BolsaChequeServices{
    
    
    BolsaChequeDAO bolsaChequeDao;
    Logger log = Logger.getLogger(BolsaChequeServicesImpl.class);
    
    
    //Inyección IoC mediante Setter
    public void setBolsaChequeDao(BolsaChequeDAO bolsaChequeDao) {
        this.bolsaChequeDao = bolsaChequeDao;
    }
    
    @Override
    public List<BolsaCheque> findEntities() {
        return bolsaChequeDao.findEntities();
    }

    @Override
    public String insert(BolsaCheque beanBolsaCheque) {
        return bolsaChequeDao.insert(beanBolsaCheque);
    }

    @Override
    public String update(BolsaCheque beanBolsaCheque) {
        return bolsaChequeDao.update(beanBolsaCheque);
    }

    @Override
    public BolsaCheque get(Integer id_bolsacheque) {
        return bolsaChequeDao.get(id_bolsacheque);
    }

    @Override
    public String delete(Integer id_bolsacheque) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public DefaultComboBoxModel combo() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<BolsaCheque> getBolsaChequeByFilters(Cliente cliente,Date fechaDesde,Date fechaHasta,
                                                    ChequeEstado chequeEstado,boolean toLiquid,Calendar fechaLiquidacion) {
       
        return bolsaChequeDao.getBolsaChequeByFilters(cliente, fechaDesde, fechaHasta, chequeEstado, toLiquid,fechaLiquidacion);
      }
    
    @Override
    public List<Cheque> getChequesToLiquidFromListOfBolsaChequeByCliente(Cliente cliente,Calendar fechaLiquidacion){
         List<BolsaCheque> bolsaChequeList = bolsaChequeDao.getBolsaChequeByFilters(cliente,null,null,null,true,fechaLiquidacion);
         List<Cheque> chequeList = new ArrayList<>();
         boolean agregarCheque = true;
         
         for (BolsaCheque bolsa : bolsaChequeList){
             for(Cheque cheque : bolsa.getChequeList()){
                        if(cheque.getFechaLiquidado() == null && cheque.getEstado() == CHEQUE_ACTIVO){
                            /*Si el cheque está en el estado ingresado pasa por defecto APROBADO en la liquidación*/
                            if(cheque.getChequeEstadoId().getId() == ChequeEstadoServices.CHEQUE_INGRESADO){
                                cheque.setChequeEstadoId(new ChequeEstado(ChequeEstadoServices.CHEQUE_APROBADO, "Aprobado"));
                            }else if(cheque.getChequeEstadoId().getId() == ChequeEstadoServices.CHEQUE_PENDIENTE && cheque.getEstado() == CHEQUE_ACTIVO){
                                    if(mustLiquidToday(cheque) || cheque.getFechaPendiente() == null){
                                        chequeList.add(cheque);
                                        agregarCheque = false;
                                    }else{
                                        agregarCheque = false;
                                    }
                            }
                           
                            if(agregarCheque){ 
                                chequeList.add(cheque);
                            }
                             agregarCheque = true;
                        }
                       
             }
         }
         return chequeList;
    }
    
   
    private boolean mustLiquidToday(Cheque cheque){
        log.info("Validando si el cheque pendiente debe ser liquidado hoy..."+cheque.getChequeNro());
        boolean liquidToday = false;
        
        /* Un cheque puede haber sido marcado pendiente antes de la liquidación y no tiene asignado una fecha de pendiente*/
        if(cheque.getFechaPendiente() != null){
        
        /*Seteamos los valores en 0 para solo comparar la FECHA , y no HH MM SS*/
        Date fechaPendiente = cheque.getFechaPendiente();
        fechaPendiente.setHours(0);
        fechaPendiente.setMinutes(0);
        fechaPendiente.setSeconds(0);
        
        Date hoy = new Date();
        hoy.setHours(0);
        hoy.setMinutes(0);
        hoy.setSeconds(0);
        
        
        if(fechaPendiente.getDate() <= hoy.getDate() && fechaPendiente.getMonth() <= hoy.getMonth() && fechaPendiente.getYear() <= hoy.getYear()){
           log.info("Liquidar hoy!");
           liquidToday = true;
            }
        }
        
        return liquidToday;
    }

    @Override
    public boolean isBolsaChequeAvailableToEdit(BolsaCheque beanBolsaCheque) {
        boolean isAvailable = true;
        
        for(Cheque cheque: beanBolsaCheque.getChequeList()){
            if(cheque.getChequeEstadoId().getId() == ChequeEstadoServices.CHEQUE_LIQUIDADO){
                isAvailable = false;
                break;
            }
        }
        
        return isAvailable;
    }
    
   
    
    

   
    
}
